package com.yueshop.order.service.impl;

import com.rabbitmq.client.Channel;
import com.yueshop.order.entity.OrderEntity;
import com.yueshop.order.entity.OrderReturnApplyEntity;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yueshop.common.utils.PageUtils;
import com.yueshop.common.utils.Query;

import com.yueshop.order.dao.OrderItemDao;
import com.yueshop.order.entity.OrderItemEntity;
import com.yueshop.order.service.OrderItemService;

@RabbitListener(queues = {"hello-java-queue"})
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderItemEntity> page = this.page(
                new Query<OrderItemEntity>().getPage(params),
                new QueryWrapper<OrderItemEntity>()
        );

        return new PageUtils(page);
    }


    /**
     * 参数 可以写下列内容:
     *  1.Message message  :原生消息详细信息. 头和体
     *  2.T<发送的消息类型>
     *  3.Channel channel 当前传输数据的通道
     *
     *
     *  Queue: 可以很多人来监听, 只要收到消息 , 队列删除消息, 而且只有一个能收到
     *  模拟场景:
     *  1.订单服务启动多个: 发送一个消息,  只有一个客户端会收到
     *  2.业务处理繁忙的时候  只有一个消息处理完 方法运行结束了 才可以收到处理下一个消息
     *
     * @RabbitHandler
     * 模拟 :在同一个队列中, 消息类型不一样
     *
     * @param message
     * @param content
     * @param channel
     */

    @RabbitHandler
    public void receiverMessage(Message message,OrderReturnApplyEntity content,Channel channel) throws InterruptedException {
        //1.获取消息体内容
       // byte[] body = message.getBody();
        //2.获取消息头属性信息
        //MessageProperties messageProperties = message.getMessageProperties();\
        System.out.println("接收到的消息内容....:"+content);
        //Thread.sleep(3000);
       // System.out.println("消息处理完成"+content.getSkuId());'
        //channel 按照自增生成的
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        System.out.println("deliveryTag=>"+deliveryTag);
        //手动确认收货 第一个参数 消息的名字 第二参数 是否批量确认
        try {

           if(deliveryTag%2==0){
               //收货
               channel.basicAck(deliveryTag,false);
               System.out.println("签收了货物.."+deliveryTag);
           }else {
               //退货requeue  false 直接丢弃  true  发回服务器.重新放入队列中
               channel.basicNack(deliveryTag,false,true);
               System.out.println("没有签收货物.."+deliveryTag);
           }
        } catch (IOException e) {
            e.printStackTrace();//网络中断
        }
    }

    @RabbitHandler
    public void receiverMessage2(Message message,OrderEntity entity,Channel channel) throws InterruptedException {
        System.out.println("接收到的消息内容....:"+entity);

    }

}